<?php
require_once("lib/mail.php");
require_once("lib/token.php");

class UsuarioBSN extends GenericBSN {

	function __construct() {
		$this->dao = new UsuarioDAO();		
	}

	public function consultar($vars) {
		try {
			$this->preencher($vars);
			$this->Records = $this->dao->consultar($this->sql, $this->params);
			$this->Result  = "OK";
		} catch (Exception $e) {
			$this->Result  = "ERROR";
			$this->Message = "Erro ao consultar: " . $e->getMessage();
		}
	}
	
	public function consultarGrupos($vars) {
		try {
			$usuario = $vars['usuario'];
			
			$grpCtxDao = new Grp_x_ContextoDAO();
			$ctx = $grpCtxDao->consultarUsuarioLogado(1);
			$dao = new Usu_x_GrupoDAO();
		    $dao->limitarContexto(!$ctx[0]['acessoConsulta']);
		    
			$this->Records = $dao->consultarGrupos($usuario);
			$this->Result = "OK";
		} catch (Exception $e) {
			$this->Result  = "ERROR";
			$this->Message = "Erro: " . $e->getMessage();
		}
	}
	
	public function consultarGruposDisponiveis($vars) {
		try {
			$grpCtxDao = new Grp_x_ContextoDAO();
			$ctx = $grpCtxDao->consultarUsuarioLogado(1);
		    $dao = new Usu_x_GrupoDAO();
		    $dao->limitarContexto(!$ctx[0]['acessoConsulta']);
		    
		    $this->Records = $dao->consultarGruposDisponiveis($vars['usuarioid'], $vars['grupo']);
			$this->Result = "OK";
		} catch (Exception $e) {
			$this->Result  = "ERROR";
			$this->Message = "Erro: " . $e->getMessage();
		}
	}

	public function inserir($vars) {
		try {
			$registro['usuario'] = $vars['usuario'];
			$registro['senha']   = $vars['senha'];
			$registro['mail']	 = $vars['mail'];
			$this->Record = $this->dao->inserir($registro);
			$this->dao->replicarConfig($_SESSION['usuario']['id'], $this->Record['id']);
			$this->Result  = "OK";
		} catch (Exception $e) {
			$this->Result  = "ERROR";
			$this->Message = "Erro ao tentar inserir: " . $e->getMessage();
		}
	}
	
	public function alterar($registro) {
		try {
			$this->dao->alterar($registro);
			$this->Result  = "OK";
		} catch (Exception $e) {
			$this->Result  = "ERROR";
			$this->Message = "Erro ao tentar alterar: " . $e->getMessage();
		}
	}
	
	public function excluir($registro) {
		try {
			$dao = new Usu_x_GrupoDAO();
			// todo: verificar contexto de usu_x_grupo
			$res = $dao->excluirUsuario($registro['id'], false);
			$res = $this->dao->excluir($registro['id']);
			$this->Result  = "OK";
		} catch (Exception $e) {
			$this->Result  = "ERROR";
			$this->Message = "Erro ao tentar excluir: " . $e->getMessage();
		}
	}

	public function login($vars) {
		try {
			$usu = $this->dao->login($vars['edtUsuario'], $vars['edtSenha']);

			if (!$usu) {
				throw new Exception("Usuário e senha inválidos!");
			}
			
			$_SESSION["usuario"] = $usu[0];
			$login["login"] 	 = $usu[0];
			$login["menu"] 		 = $this->getMenu();
			$login["config"] 	 = $this->setarConfig();

			$this->Message = "Bem-vindo, " . $usu[0]['usuario'] . ".";
			if ($usu[0]["senha_temp"]) {
				$this->dao->excluirSenhaTemp($usu[0]['id']);
				$this->Message .= "<br /><br /><b>Atenção: </b> O login foi efetivado com o uso da senha temporária, por favor, altere sua senha na Página do Usuário.<br />";
			}
			
			$this->Result  = "OK";
			$this->Records = $login;
		} catch (Exception $e) {
			$this->logout();
			$this->Result  = "ERROR";
			$this->Message = $e->getMessage();
		}
	}
	
	private function setarConfig() {
		$cfg = $this->dao->consultarConfig($_SESSION['usuario']['id']);
		$_SESSION["config"] = $cfg;
		return $cfg;
	}
	
	public function consultarConfig() {
		try {
			if (!isset($_SESSION["usuario"]["id"])) {
				throw new Exception("Efetue login primeiro!");
			}
			
			if (!isset($_SESSION["config"])) {
				$_SESSION["config"] = $this->dao->consultarConfig($_SESSION['usuario']['id']);
			}
			$this->Records = $_SESSION["config"];
			$this->Result  = "OK";
		} catch (Exception $e) {
			$this->Result  = "ERROR";
			$this->Message = "Erro: " . $e->getMessage();
		}
	}
	
	public function alterarConfig($vars) {
		try {
			if (!isset($vars['carencia'])) {
				throw new Exception("Parâmetro 'carencia' não informado!");
			}
			
			if (!isset($vars['periodo'])) {
				throw new Exception("Parâmetro 'periodo' não informado!");
			}
				
			if (!isset($vars['valormanut'])) {
				throw new Exception("Parâmetro 'valormanut' não informado!");
			}
				
			if (!isset($vars['tx_sepult'])) {
				throw new Exception("Parâmetro 'tx_sepult' não informado!");
			}
				
			if (!isset($vars['tx_transf'])) {
				throw new Exception("Parâmetro 'tx_transf' não informado!");
			}
				
			if (!isset($vars['tx_exuma'])) {
				throw new Exception("Parâmetro 'tx_exuma' não informado!");
			}
				
			if (!isset($vars['receitas'])) {
				throw new Exception("Parâmetro 'receitas' não informado!");
			}
				
			if (!isset($vars['ossuario'])) {
				throw new Exception("Parâmetro 'ossuario' não informado!");
			}
				
			$registro['usuario'] = $_SESSION['usuario']['id'];
			$registro['parametro'] = 'carencia';
			$registro['valor'] = $vars['carencia'];
			$this->dao->alterarConfig($registro, false);
			
			$registro['parametro'] = 'periodo';
			$registro['valor'] = $vars['periodo'];
			$this->dao->alterarConfig($registro, false);
			
			$registro['parametro'] = 'valormanut';
			$registro['valor'] = $vars['valormanut'];
			$this->dao->alterarConfig($registro, false);
			
			$registro['parametro'] = 'tx_sepult';
			$registro['valor'] = $vars['tx_sepult'];
			$this->dao->alterarConfig($registro, false);
			
			$registro['parametro'] = 'tx_transf';
			$registro['valor'] = $vars['tx_transf'];
			$this->dao->alterarConfig($registro, false);
			
			$registro['parametro'] = 'tx_exuma';
			$registro['valor'] = $vars['tx_exuma'];
			$this->dao->alterarConfig($registro, false);
			
			$registro['parametro'] = 'receitas';
			$registro['valor'] = $vars['receitas'];
			$this->dao->alterarConfig($registro, false);
			
			$registro['parametro'] = 'ossuario';
			$registro['valor'] = $vars['ossuario'];
			$this->dao->alterarConfig($registro);
			
			$this->setarConfig();
			$this->Result = 'OK';
			$this->Message = 'Configuração alterada com sucesso!';
		} catch (Exception $e) {
			$this->Result  = "ERROR";
			$this->Message = "Erro: " . $e->getMessage();
		}
	}
	
	public function alterarSenha($vars) {
		try {
			if (!$_SESSION['usuario']['senha_temp']) {
				$usu = $this->dao->login($_SESSION['usuario']['usuario'], $vars['senhaatual']);
				if (!$usu) {
					throw new Exception("Senha atual inválida!");
				}
			}
			
			$usuario['id'] = $_SESSION['usuario']['id'];
			$usuario['senha'] = $vars['novasenha']; 
			$this->dao->alterar($usuario);
			
			$this->Message = "Senha alterada com sucesso!";
			$this->Result = "OK";
		} catch (Exception $e) {
			$this->Result  = "ERROR";
			$this->Message = "Erro: " . $e->getMessage();
		}
	}
	
	private function getMenu() {
		$dao = new RecursoDAO();
		return $dao->consultarArvore("mnSistema");
	}
	
	public function logout() {
		try {
			session_destroy();
			unset($_SESSION);
			$this->clear();
			$this->Result = "OK";
		} catch (Exception $e) {
			$this->Result = "ERROR";
			$this->Message = "Erro: " . $e->getMessage();
		}
	}
	
	public function redefinirSenha($vars) {
		try {
			$usuario = $this->dao->inserirSenhaTemp($vars['edtUsuario'], Token::gerar(10));
			
			if ($usuario) {
				$assunto = utf8_decode("Compras-Net 2.0 - Redefinição de senha");
	
				$corpo  = "Nas próximas 24 horas você poderá efetuar o login no sistema com a seguinte senha: $token\n\n";
				$corpo .= "O sistema informará sobre a necessidade de alteração da senha assim que o login for feito utilizando essa senha temporária.\n\n";
				$corpo .= "A senha antiga continua válida até que a alteração de senha seja confirmada, portanto, se não foi você quem solicitou essa redefinição de senha, basta ignorá-la.\n\n";
				$corpo .= "Essa é uma mensagem automática e não deve ser respondida.";
	
				Mail::enviarEmail($usuario['mail'], $assunto, $corpo);
				$this->Result = "OK";
				$this->Message = "Mensagem com instruções enviada para o e-mail cadastrado.";
			} else {
				throw new Exception("Endereço eletrônico do usuário não encontrado!");
			}
		} catch (Exception $e) {
			$this->Result  = "ERROR";
			$this->Message = "Erro: " . $e->getMessage();
		}
	}
		
	public function inserirGrupo($vars, $finalizarTransacao = true) {
		try {
			$dao = new GrupoUsuariosDAO();
			$grp = is_numeric($vars['grupo']) ? $dao->consultarPK($vars['grupo']) : $dao->consultarGrupo($vars['grupo']);
			
			if (!isset($grp[0]['id'])) {
				throw new Exception("Perfil <b>" . $vars['grupo'] . "</b> não encontrado!");
			}
			
			$reg['grupo'] = $grp[0]['id'];
			$res['grupo'] = $grp[0]['grupo'];
			$reg['usuario'] = $vars['usuario'];
			$res['pk'] =  $vars['usuario'] . "," . $reg['grupo'];

			$grpCtxDao = new Grp_x_ContextoDAO();
			$ctx = $grpCtxDao->consultarUsuarioLogado(1);
			$dao = new Usu_x_GrupoDAO();
		    $dao->limitarContexto(!$ctx[0]['acessoAlteracao']);
		    
		    $grps = $dao->consultarGruposDisponiveis($reg['usuario'], $reg['grupo']);
		    if (!$grps) {
		    	throw new Exception("Perfil <b>" . $res['grupo'] . "</b> não encontrado ou indisponível para o usuário."); 
		    }
			
		    $dao->inserir($reg, $finalizarTransacao);
			$reg['pk']		= $vars['usuario'] . "," . $vars['grupo'];

			$this->Record  = $res;
			$this->Result  = "OK";
		} catch (Exception $e) {
			$this->Result  = "ERROR";
			$this->Message = $e->getMessage();
		}
	}
	
	public function excluirGrupo($vars) {
		try {
			$dao = new Usu_x_GrupoDAO();
			$pk = explode(",", $vars["pk"]);
			$reg['usuario'] = $pk[0];
			$reg['grupo'] = $pk[1];
	
			// contexto
			$grpCtxDao = new Grp_x_ContextoDAO();
			$ctx = $grpCtxDao->consultarUsuarioLogado(1);
			$grpUsuDao = new GrupoUsuariosDAO();
			if (!$ctx[0]['acessoAlteracao']) {
				if (!$grpUsuDao->estaNoContexto($reg['grupo'])) {
					throw new Exception("Tentativa de excluir um usuário de um perfil fora do contexto permitido.");
				}
			}
			// fim contexto
				
			$dao->excluir($reg);
			$this->Result  = "OK";
		} catch (Exception $e) {
			$this->Result  = "ERROR";
			$this->Message = $e->getMessage();
		}
	}
}
?>